package com.hmkj.core.service.order;

import com.hmkj.common.entity.dtgrid.DtGrid;
import com.hmkj.core.eolinker.models.ModelRealTime;
import com.hmkj.core.exception.DtGridException;
import com.hmkj.core.model.BuyModel;
import com.hmkj.core.model.order.OrderModel;
import com.hmkj.core.po.account.Account;
import com.hmkj.core.po.order.Order;
import com.hmkj.core.po.system.Admin;
import com.hmkj.core.po.user.User;
import com.hmkj.core.service.base.GenericService;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 用户点买策略订单业务相关Service接口<br>
 *
 * @author lizhijie
 * @ClassName: OrderService
 * @date 2018-07-05 05:19:00
 */
public interface OrderService extends GenericService<Integer, Order> {

    /**
     * 计算订单的当前盈亏金额
     *
     * @param orderId 订单信息
     * @return 盈亏金额
     */
    BigDecimal getOrderCurrentProfit(Integer orderId);

    /**
     * 订单回填
     *
     * @param order 订单信息
     * @param admin
     */
    void doOrderBack(Order order, Admin admin) throws Exception;

    /**
     * 查询某一时间段结算订单
     *
     * @param param
     * @return
     */
    List<Order> selectOrderForTime(Map<String, Object> param);

    /**
     * 点买
     *
     * @param user
     * @param modelRealTime
     * @param model
     */
    void buyOrder(User user, ModelRealTime modelRealTime, BuyModel model);

    /**
     * 平仓（前台）
     *
     *  * @param id
     *  * @param user
     */
    void toCover(Integer id,User user) throws Exception;

    /**
     * 统计方案总数
     *
     * @param id id
     * @return long
     */
    long countOrders(int id);


    /**
     * 获取当前登录用户所有平仓中的订单数量
     * @param currAdmin 当前登录用户
     * @return 持仓中的订单数量
     */
    long getTotalClosingCount(Admin currAdmin) throws Exception;

    /**
     * 抢单
     *
     * @param order    订单信息
     * @param admin
     */
    int doScrambleOrder(Order order, Admin admin) throws Exception;

    /**
     * 修改持仓中的订单信息
     *
     * @param orderId          订单id
     * @param modifyDealPrice  修改后金额
     * @param modifyDealNumber 修改后数量
     * @param name
     * @return 是否修改成功
     * @throws Exception
     */
    int modifyHoldingOrder(Integer orderId, Double modifyDealPrice, Integer modifyDealNumber, String name) throws Exception;

    /**
     * 订单补亏
     *
     * @param order
     * @param repair
     * @param admin
     * @throws Exception
     */
    void doRepairLoss(Order order, BigDecimal repair, Admin admin) throws Exception;

    /**
     * 补亏资金记录
     *
     * @param order
     * @param repair
     * @throws Exception
     */
    void doRepairLog(Order order, BigDecimal repair) throws Exception;

    /**
     * 结算
     *
     * @param order 订单
     * @param admin
     */
    void doAccount(Order order, Admin admin) throws Exception;

    /**
     * 订单补亏(用户端)
     *
     * @param order
     * @param repair
     * @param
     */
    void doRepairLoss(Order order, BigDecimal repair) throws Exception;

    /**
     * 修改止损
     * @param order
     * @param stopLosePrice
     * @param needDeposit
     * @param lastPrice
     * @throws Exception
     */
    void doModifyStopLoss(Order order, BigDecimal stopLosePrice,BigDecimal needDeposit,BigDecimal lastPrice) throws Exception;

    /**
     * 统计不同用户需要收取的递延费基数
     *
     * @return
     */
    List<OrderModel> selectDiYanGroupByUser();

    /**
     * 平仓指令
     *
     * @param orderId
     * @param coverType
     */
    void doCoverOrder(Integer orderId, Integer coverType) throws Exception;

    /**
     * 流单
     *
     * @param orderId
     */
    void doFlowOrder(Integer orderId, Admin admin) throws Exception;

    /**
     * 强平指令
     * @param order
     * @param admin
     */
    void doSell(Order order, Admin admin)throws Exception;

    /**
     * 平仓中撤回
     * @param order
     * @param admin
     */
    void doBackWithCoving(Order order, Admin admin)throws Exception;

    /**
     * 卖出回填
     * @param order
     * @throws Exception
     */
    void doSaleBack(Order order,Admin admin)throws Exception;


    /**
     * 订单按用户分组
     *
     * @param list
     * @return
     */
    Map<Integer, List<Order>> splitGroupByUser(List<Order> list);

    /**
     * 计算总递延费
     *
     * @param waitDeferOrders
     * @return
     */
    public BigDecimal getTotalDeferMoney(List<Order> waitDeferOrders);

    /**
     * 获取持仓中点买金额最小 收益最大的订单 - 使用冒泡排序
     *
     * @param orders 持仓中的订单
     * @return 满足条件的订单
     */
    public Order getMinTradeCreditOrMaxProfitOrder(List<Order> orders);

    /**
     * 处理递延订单
     */
    public void handlerWaitDeferOrders(Integer orderId) throws Exception;

    /**
     * 当日成交订单
     */
    List<Order> selectTodayDealOrder();

    /**
     * 当日结算订单
     */
    List<Order> selectTodaySettleOrder();

    /**
     * 记录投资人资金日志
     *
     * @param o             订单
     * @param depositProfit 保证金
     * @param amount        操作金额
     * @param invest        账户
     * @param type          类型：1，盈利 2，亏损 3，穿仓
     * @throws Exception
     */
    void doInvestAccountOperation(Order o, BigDecimal depositProfit, BigDecimal amount, Account invest, Integer type) throws Exception;

    /**
     * 查询用户递延费不足列表
     */
    DtGrid getDtGridListForDiyan(String dtGridPager, Class entityClazz) throws DtGridException;

    /**
     * 查询昨天策略交易笔数
     * @param userId
     * @return
     */
    List<Order> selectYesStrategy(Integer userId) throws Exception;

    /**
     * 策略最后发布时间
     * @param userId
     * @return
     * @throws Exception
     */
    Order selectByOne(Integer userId) throws Exception;
}
